// 显示fx按钮
export function showFx(item, attr, relationArr, reverseObj) {
  checkInput(item[attr + 'Label'], item, attr, relationArr, reverseObj)
  item[attr + 'FxVisible'] = true
}
// 隐藏fx按钮
export function hiddenFx(item, attr) {
  item[attr + 'FxVisible'] = false
}

// 输入框的方法
export function checkInput(val, Obj, attr, relationArr, reverseObj) {
  // 关闭fx框
  Obj[attr + 'FxVisible'] = false
  // Variable值初始赋值为input框的值
  Obj[attr] = val
  // 级联选择器关系数组
  relationArr.forEach((item) => {
    // 拼接字符串为`${:}`格式
    const { mixStr, valueStr } = tidyStr(item, reverseObj)
    // input输入框有而级联选择器没有
    if (val.includes(mixStr)) {
      if (!Obj[attr + 'Value'].includes(item)) {
        Obj[attr + 'Value'].push(item)
      }
      // 去空值
      Obj[attr + 'Value'] = Obj[attr + 'Value'].filter((item) => {
        return item.length > 0
      })
      // eslint-disable-next-line brace-style
    } // 级联选择器有而输入框没有
    else {
      Obj[attr + 'Value'] = Obj[attr + 'Value'].filter((i) => {
        return i.toString() !== item.toString()
      })

      // 去除空值
      Obj[attr + 'Value'] = Obj[attr + 'Value'].filter((item) => {
        return item.length > 0
      })
    }
    // Variable值替换${ } 内为id格式，用自身replace，避免被重置掉
    Obj[attr] = Obj[attr].replace(mixStr, valueStr)
  })
}

// 级联选择器选中事件
export function casClick(val, Obj, attr, relationArr, reverseObj) {
  // 级联选择器没有，input有
  relationArr.forEach((item) => {
    // 拼接字符串为`${:}`格式
    const { mixStr, valueStr } = tidyStr(item, reverseObj)
    const isInside = val.some((i) => {
      return i.toString() === item.toString()
    })

    // input值有但是级联选择器没有
    if (Obj[attr + 'Label'].includes(mixStr)) {
      if (!isInside) {
        Obj[attr + 'Label'] = Obj[attr + 'Label'].replace(mixStr, '')
        Obj[attr] = Obj[attr].replace(valueStr, '')
      }
    } else {
      // input没有，但是级联选择器有
      if (isInside) {
        Obj[attr + 'Label'] += mixStr
        Obj[attr] += valueStr
      }
    }
  })
}
// 整理为${:}字符串
export function tidyStr(item, reverseObj) {
  const obj = {
    mixStr: '${',
    valueStr: '${'
  }
  for (let index = 0; index < item.length; index++) {
    obj.mixStr += reverseObj[item[index]]
    if (index !== item.length - 1) {
      obj.mixStr += ':'
    }
    obj.valueStr += item[index]
    if (index !== item.length - 1) {
      obj.valueStr += ':'
    }
  }
  obj.mixStr += '}'
  obj.valueStr += '}'
  return obj
}
// 对象数组扁平化为对象
export function flatten(arr, reverse) {
  let obj = {}
  arr.forEach((item) => {
    const a = reverse ? item.value : item.label
    const b = reverse ? item.label : item.value
    obj[a] = b
    if (item.children) {
      obj = { ...flatten(item.children, reverse), ...obj }
    } else return
  })
  return obj
}
// 整合父子关系数组 [父，子,孙....]
export function flattenArr(arr, allArr, relationArr) {
  arr.forEach((item) => {
    const temp = [...allArr, item.value]
    if (item.children && item.children) {
      flattenArr(item.children, temp, relationArr)
    } else {
      relationArr.push(temp)
    }
  })
}

//  重组表单组件的数据
export function getFormComponent(param, newArr = []) {
  const arr = []
  if (param.length > 0) {
    param.forEach((i, index) => {
      if (i.type === 'grid') {
        if (i.columns.length > 0) {
          i.columns.forEach(j => {
            getFormComponent(j.list, newArr)
          })
        }
      } else {
        arr.push({
          type: i.type,
          label: i.name,
          value: i.model,
          options: i.options
        })
      }
    })
    newArr.push.apply(newArr, arr)
    return newArr
  }
}
//  平铺数组
export function setJsonLists(param, newArr = []) {
  const arr = []
  if (!param) return []
  if (param?.length > 0) {
    param.forEach(i => {
      if (i.type === 'grid') {
        if (i.columns.length > 0) {
          i.columns.forEach(j => {
            setJsonLists(j.list, arr)
          })
        }
      } else {
        return arr.push(i)
      }
    })
    newArr.push.apply(newArr, arr)
    return newArr
  }
}